# 变量
# 命名规则：大小写字母、数字、下划线，不能以数字开头，不能是关键字(保留字)
# 定义变量时必须赋值（定义即赋值）
# 定义时不需要指定类型，但不是没有类型，变量的类型可以由等号右边赋的值推断出来
# 变量的类型可以随着程序运行不断变化
# 动态数据类型
i = 10
j = 20
print(i)
print(j)
k = 10
print(type(i))
print(type(j))
print(type(k))
i = "abc"
print(type(i))

import keyword

# 查看Python关键字
print(keyword.kwlist)

# 单行注释 类似Java中的 //
'''
多行注释一般用于文档说明
类似Java中的 /**
            *
            *
            */
这是多行注释
这是多行注释
这是多行注释
'''
"""
这是多行注释
这是多行注释
这是多行注释
"""

# 查看变量的类型
# type
print(type(i))

print("*" * 20)

# 五大基本数据类型
# 都是不可变的
# 整型int、浮点类型float、字符串类型str、布尔类型bool、空类型NoneType
i = 100
print(i, type(i))
f = 1.123
print(f, type(f))
# 可以用单引号或双引号 都表示字符串
str1 = 'abcdefg'
str2 = "hijklmn"
str3 = 'a'
print(str1, type(str1))
print(str2, type(str2))
print(str3, type(str3))

# 首字母大写
bool1 = False
bool2 = True
print(bool1, type(bool1))
print(bool2, type(bool2))

non = None
print(non, type(non))

# 算术运算符
# 整型、浮点类型可以参与算数运算
# + - * / % ** //
int1 = 10
float1 = 3.33
print(int1 + float1)
print(int1 - float1)
print(int1 * float1)
print(int1 / float1)
print(10 % 3)  # 取余
print(10 ** 3)  # 1000 10的3次方
print(10 // 3)  # 3 向下取整

# 逻辑运算
# 布尔类型通常用于逻辑运算以及 条件表达式（if、while）
# 与 或 非 异或
t = True
f = False
print(t & f)  # 与
print(t and f)  # 与
print(t | f)  # 或
print(t or f)  # 或
print(not f)  # 非
print(t ^ f)  # 异或

# 字符串类型常见的操作
# 前面定义的变量，后面可以重新定义并赋值
str1 = 'hello,world,java,python'
# 切分字符串，得到一个list
list1 = str1.split(",")
print(list1)
# 将List中的每一个元素拼接成字符串
print("|".join(list1))

# 去除字符串左右两边的隐藏字符
# 隐藏字符：\n \t 空格
str2 = '\t\n    abc   efg \t\n \n'
print(str2)
print(str2.strip())

# 格式化字符串
# 按照一定的格式输出字符串
# %s %d %f
# 可以限定类型
print("%s字符串，%.2f小数，%d整数" % ('abc', 1.236, 123))

# 使用format方法
# 5 * 4 = 20
# {} * {} = {}
# 可以给每个带传入的值指定一个名字
str_fm1 = "{} * {} = {}"
print(str_fm1.format(5, 4, 20))
print(str_fm1.format('5, 4, 20', 10, 1000))

# 分页url需要page、pageSize参数
# https://www.shujia.com/stu/page=5&pageSize=10
url_format1 = 'https://www.shujia.com/stu/page={}&pageSize={}'
url_format2 = 'https://www.shujia.com/stu/page={page}&pageSize={pageSize}'
print(url_format1.format(3, 10))
print(url_format2.format(page=3, pageSize=10))

print(str1)
print(str1.replace(",", "，"))  # 返回了新的字符串，并不会对原有字符串产生影响
print(str1)

# 提取字符串
# 切片
# [起始位置:结束位置:步长]
# 将字符串看成由一个个的字符组成的list
# 将每个字符看成这个list中的每个元素
# 每个元素都有一个位置(索引，默认从左往右 从0开始)
# 起始位置 默认 为第一个字符的位置
# 结束位置 默认 为最后一个字符的位置
# 步长 默认 为1
str3 = '01234567'
print(str3[1:3 + 1:1])  # 123
print(str3[3:6 + 1:])  # 3456
print(str3[1::2])  # 1357
print(str3[::2])  # 0246
# 位置支持负数索引
print(str3[3])  # 如果直接传入一个参数 表示按照索引位置 取元素
print(str3[-5])
print(str3[1:3])  # 如果直接传入两个参数 表示省略了步长

# 步长也可以为负数
# 从右往左取
print(str3[::-1])  # 倒转字符串

# 类型转换
# 要转换成什么类型，就调用该类型对应的类型名称 对应的方法
# int() float() str() bool()
int1 = 100
float1 = 88.88
str1 = '99'
str2 = '99.99'

# str to int
str2int = int(str1)
print(str2int, type(str2int))
# str to float
str2float = float(str2)
print(str2float, type(str2float))
# int to str
# float to str
print(str(int1), type(str(int1)))
print(str(float1), type(str(float1)))

# 转换时一定要注意 数据是否符合要求
strError = 'abcdef'
# int(strError)

# to bool
# 数值型转bool：除零以外都是True
# 字符串转bool：除空字符串以外都是True
print(bool(11))  # True
print(bool(1))  # True
print(bool(0))  # False
print(bool(-0))  # False
print(bool(-11))  # True

print(bool(1.123))  # True
print(bool(1.0))  # True
print(bool(0.0))  # False
print(bool(-0.0))  # False
print(bool(-1.234))  # True

print(bool('abc'))  # True
print(bool(''))  # False
print(bool('True'))  # True
print(bool('False'))  # True
